package edu.gtcfla.km.repositories;

import java.io.Serializable;
import java.util.Set;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.Repository;

import edu.gtcfla.km.Knowledge;

/**
 * 
 * @author Bill Vison
 *
 * @param <T>
 * @param <ID>
 */
public interface KnowledgeRepo<T extends Knowledge, ID extends Serializable> extends Repository<T, ID> {

	/**
	 * 保存当前系统角色
	 * @param entity
	 * @return
	 */
	void save(T entity);
	
	/**
	 * 更新数据对像
	 * @param entity
	 */
	void update(T entity);

	/**
	 * 查询一条数据进行保存
	 * @param entity
	 * @return
	 */
	T findOne(ID primaryKey);

	/**
	 * 查询显示所有操作
	 * @param entity
	 * @return
	 */
	Iterable<T> findAll();

	/**
	 * 计算当前实体总数
	 * @return
	 */
	Long count();

	/**
	 * 删除（直接移除）指定实体数据
	 * @param entity
	 */
	void deleteDirectly(T entity);
	
	/**
	 * 删除被标识了移除的数据，该操作只允许管理员操作
	 * @param entity
	 */
	void deleteFully(T entity);

	/**
	 * 删除（移走数据，不直接显示）指定实体数据，即对数据进行删除标识
	 * @param entity
	 */
	void remove(T entity);

	/**
	 * 检查当前ID是否存在
	 * @param primaryKey
	 * @return
	 */
	boolean exists(ID primaryKey);
	
	/**
	 * get the all knowledge
	 * @param pageable
	 * @return
	 */
	Page<Knowledge> pageKnowledgeByCurrentUser(Pageable pageable , Set<String> categoryIds);
	
	
	Page<Knowledge> pageKnowledgeByCurrentUser(Pageable pageable , Set<String> categoryIds , String currentUserId , String userGroupId);
	
	
	
	/**
	 * list all knowledge by category
	 * @param categoryId
	 * @return
	 */
	Set<Knowledge> listKnowledgeByCategoryId(String categoryId);

}
